home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / MISC / BM192A.ZIP / SHARDS.S < prev    next >
Encoding:
Text File  |  1996-02-23  |  11.0 KB  |  417 lines

  1. *=======================================================*
  2. *    Shards: latest update 23/02/96            *
  3. *=======================================================*
  4. *    Interface with DSP to retrieve floors & walls    *
  5. *=======================================================*
  6.  
  7. *-------------------------------------------------------*
  8. *    WARNING:                    *
  9. *-------------------------------------------------------*
  10. *    This is the least finished module of the 3D    *
  11. *    core, and the most volatile beside the DSP    *
  12. *    module itself. Altering it could be a very    *
  13. *    bad idea. Please wait until I have finished    *
  14. *    writing it!                    *
  15. *-------------------------------------------------------*
  16.  
  17. sz1        =    64        ; sample z1
  18. sz2        =    128        ; sample z2
  19.  
  20. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  21. *    Generate a new wall, floor & ceiling chunk    *
  22. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  23.     txtlong
  24. *-------------------------------------------------------*
  25. add_wall_segment:
  26. *-------------------------------------------------------*
  27.     pea        (a3)
  28.     pea        (a4)
  29. *-------------------------------------------------------*
  30.     lea        DSPHostStat.w,a4
  31.     lea        DSPHost32.w,a5
  32. *-------------------------------------------------------*
  33.     move.l        addwall_z1(a6),d1
  34.     move.l        addwall_z2(a6),d2
  35.     move.l        d1,addwall_pz1(a6)
  36.     move.l        d2,addwall_pz2(a6)
  37.  
  38.     sub.l        d1,d2
  39.     bpl.s        .ak1
  40.     neg.l        d2
  41. .ak1:    lsr.l        #7,d1
  42.     cmp.l        d1,d2
  43.     bpl.s        .ak2
  44.  
  45.     move.l        addwall_pz2(a6),d1
  46.     move.l        d1,addwall_pz2(a6)
  47.     move.l        d1,addwall_rz1(a6)
  48.     add.l        #2000<<16,d1
  49.     move.l        d1,addwall_pz1(a6)
  50.     move.l        d1,addwall_rz2(a6)
  51.  
  52.     dspwrite.b    #linear_command,(a4)
  53.     bra.s        .lin
  54.     
  55. .ak2:    dspwrite.b    #perspected_command,(a4)
  56. .lin:    move.l        addwall_pz1(a6),addwall_t2(a6)
  57.     move.l        addwall_pz2(a6),addwall_t1(a6)
  58. *-------------------------------------------------------*
  59.     moveq        #0,d6
  60.     move.w        addwall_hhig(a6),d6    ; (h/2)
  61.     moveq        #0,d0
  62.     move.w        addwall_vscale(a6),d0    ; vscale
  63.     swap        d0
  64.     swap        d6    
  65. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  66. *    Vertical (y) perspective projection        *
  67. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  68. *    y' = y * ( (w/2) / z ) + (h/2)            *
  69. *-------------------------------------------------------*
  70.     move.l        addwall_y1(a6),d1
  71.     move.l        d0,d2
  72.     muls.l        d1,d7:d2
  73.     divs.l        addwall_z1(a6),d7:d2
  74.     add.l        d6,d2
  75.     move.l        d0,d5
  76.     muls.l        d1,d7:d5
  77.     divs.l        addwall_z2(a6),d7:d5
  78.     move.l        addwall_y2(a6),d1
  79.     add.l        d6,d5
  80.     move.l        d0,d3
  81.     muls.l        d1,d7:d3
  82.     divs.l        addwall_z1(a6),d7:d3
  83.     add.l        d6,d3
  84.     move.l        d0,d4
  85.     muls.l        d1,d7:d4
  86.     divs.l        addwall_z2(a6),d7:d4
  87.     add.l        d6,d4
  88. *-------------------------------------------------------*
  89. *    Calculate dy1 & dy2 gradients            *    
  90. *-------------------------------------------------------*
  91.     move.l        addwall_i2(a6),d0
  92.     sub.l        addwall_i1(a6),d0
  93.     sub.l        d2,d5
  94.     swap        d5
  95.     move.w        d5,d6
  96.     ext.l        d6
  97.     clr.w        d5
  98.     divs.l        d0,d6:d5    ; dy1 = (ry1-ly1) / (x2-x1)
  99.     move.l        d4,d1
  100.     sub.l        d3,d1
  101.     swap        d1
  102.     move.w        d1,d6
  103.     ext.l        d6
  104.     clr.w        d1
  105.     divs.l        d0,d6:d1    ; dy2 = (ry2-ly2) / (x2-x1)
  106. *-------------------------------------------------------*
  107. *    Calculate dz gradient                *
  108. *-------------------------------------------------------*
  109.     move.l        addwall_t2(a6),d4
  110.     sub.l        addwall_t1(a6),d4
  111.     swap        d4
  112.     move.w        d4,d6
  113.     clr.w        d4
  114.     ext.l        d6
  115.     divs.l        d0,d6:d4
  116.     move.l        d4,addwall_ti(a6)
  117. *-------------------------------------------------------*
  118. *    Clip wall against left edge            *    
  119. *-------------------------------------------------------*
  120.     move.l        addwall_i1(a6),d7
  121.     move.l        d7,d6
  122.     swap        d6
  123.     ext.l        d6
  124.     bpl.s        .ok1
  125.     moveq        #0,d6
  126. .ok1:    move.l        d6,a3
  127.  
  128.     swap        d6
  129.     sub.l        d6,d7    
  130.     move.l        d7,a2
  131.  
  132.     move.l        a2,d6
  133.     clr.w        d6
  134.     muls.l        d5,d7:d6
  135.     move.w        d7,d6
  136.     swap        d6
  137.     sub.l        d6,d2        ; y1 = y1 - (x1*dy1)
  138.  
  139.     move.l        a2,d6
  140.     clr.w        d6
  141.     muls.l        d1,d7:d6
  142.     move.w        d7,d6
  143.     swap        d6
  144.     sub.l        d6,d3        ; y2 = y2 - (x1*dy2)
  145.  
  146.     move.l        addwall_t1(a6),d0
  147.     move.l        a2,d6
  148.     muls.l        d4,d7:d6
  149.     move.w        d7,d6
  150.     swap        d6
  151.     sub.l        d6,d0        ; z1 = z1 - (x1*dz)
  152.     move.l        d0,addwall_t1(a6)
  153.  
  154.     move.l        a3,d7
  155.  
  156. *-------------------------------------------------------*
  157. *    Load results into local loop registers        *    
  158. *-------------------------------------------------------*
  159.     move.l        d2,addwall_y1a(a6)
  160.     move.l        d3,addwall_y2a(a6)
  161.     move.l        d5,addwall_y1i(a6)
  162.     move.l        d1,addwall_y2i(a6)
  163. *-------------------------------------------------------*
  164.  
  165.     move.w        umag,d6
  166.     swap        d6
  167.     clr.w        d6
  168.  
  169.     move.l        addwall_rz2(a6),d1
  170.     sub.l        addwall_rz1(a6),d1
  171.  
  172.     move.l        addwall_pz2(a6),d0
  173.     sub.l        addwall_rz1(a6),d0
  174.  
  175.     
  176.     muls.l        d6,d2:d0
  177.  
  178.     divs.l        d1,d2:d0
  179.     move.l        d0,addwall_tu2(a6)
  180.  
  181.     move.l        addwall_pz1(a6),d0
  182.     sub.l        addwall_rz1(a6),d0
  183.  
  184.     muls.l        d6,d2:d0
  185.  
  186.     divs.l        d1,d2:d0
  187.     move.l        d0,addwall_tu1(a6)
  188.  
  189. *-------------------------------------------------------*
  190. *    Clip wall against right edge            *
  191. *-------------------------------------------------------*
  192.     move.w        addwall_i2(a6),d6
  193.     move.w        addwall_width(a6),d0
  194.     cmp.w        d0,d6
  195.     bmi.s        .x2in
  196.     move.w        d0,d6
  197. .x2in:    move.w        d6,addwall_ci2(a6)
  198. *-------------------------------------------------------*
  199.     cmp.b        #UPPER_TYPE,addwall_type(a6)
  200.     beq.s        .upper
  201.     cmp.b        #LOWER_TYPE,addwall_type(a6)
  202.     beq.s        .lower
  203. .wall:    moveq        #wall_command,d0
  204.     bra.s        .go
  205. .upper:    moveq        #upper_command,d0
  206.     bra.s        .go
  207. .lower:    moveq        #lower_command,d0
  208. .go:    dspwrite.b    d0,(a4)
  209.  
  210. xxx:    lea        DSPHostStat.w,a2
  211.  
  212.     dspwrite.r    addwall_y1a(a6),(a4)
  213.     dspwrite.r    addwall_y1i(a6),(a4)
  214.     dspwrite.r    addwall_y2a(a6),(a4)
  215.     dspwrite.r    addwall_y2i(a6),(a4)
  216.     dspwrite.r    addwall_t1(a6),(a4)
  217.     dspwrite.r    addwall_ti(a6),(a4)
  218.     dspwrite.r    addwall_pz2(a6),(a4)
  219.     dspwrite.r    addwall_pz1(a6),(a4)
  220.  
  221.     dspwrite.r    addwall_tu1(a6),(a4)
  222.     move.l        addwall_tu2(a6),d0
  223.     sub.l        addwall_tu1(a6),d0
  224.     dspwrite.r    d0,(a4)
  225.  
  226.  
  227.     move.l        addwall_y2(a6),d0
  228.     sub.l        addwall_y1(a6),d0
  229.     swap        d0
  230.     ext.l        d0
  231.     dspwrite.l    d0,(a4)
  232.     
  233.     dspwrite.l    #128,(a4)
  234.     
  235.     dspwrite.w    uoff,(a4)
  236.     
  237.     moveq        #0,d0
  238.     dspwrite.l    d7,(a4)
  239.     move.w        addwall_ci2(a6),d0
  240.     dspwrite.l    d0,(a4)
  241.     dspwrite.l    #0,(a4)
  242.     move.w        columns,d0
  243.     dspwrite.l    d0,(a4)
  244.  
  245. yyy:    pushall
  246.     lea        DSPHost32.w,a3
  247.     lea        DSPHost16.w,a1
  248.     lea        DSPHostStat.w,a2
  249.     move.w        brightness,d2
  250.     move.w        addwall_tex(a6),d7
  251. *-------------------------------------------------------*
  252.     bsr        render_wall
  253. *-------------------------------------------------------*
  254.     moveq        #0,d5
  255.     move.w        d5,wallruncount
  256. *-------------------------------------------------------*
  257.     dspread.w    columns
  258. *-------------------------------------------------------*
  259.     popall
  260. *-------------------------------------------------------*
  261.     pop.l        a4
  262.     pop.l        a3
  263.     rts
  264.  
  265. umag:    dc.w        128
  266.     
  267. cz1:    ds.l        1
  268. cz2:    ds.l        1
  269. fz1:    ds.l        1
  270. fz2:    ds.l        1
  271.  
  272. *-------------------------------------------------------*
  273.     txtlong
  274. *-------------------------------------------------------*
  275. get_ssector:
  276. *-------------------------------------------------------*
  277.     push.l        a6
  278. *-------------------------------------------------------*
  279.     lea        DSPHost16.w,a1
  280.     lea        DSPHost32.w,a5
  281.     lea        DSPHostStat.w,a2
  282. *-------------------------------------------------------*
  283.     moveq        #getssector_command,d0
  284.     dspwaitwrite    (a2)
  285.     move.w        d0,(a1)
  286.     dspwaitwrite    (a2)
  287.     move.w        ceiling_y,(a1)
  288.     dspwaitwrite    (a2)
  289.     move.w        floor_y,(a1)
  290. *-------------------------------------------------------*
  291. *    Set up luminance, texture indexes & horizon    *    
  292. *-------------------------------------------------------*
  293.     move.w        #256-1,d4
  294.     move.l        zone_ptr,a4
  295.     move.w        ceiling_texture,d0
  296.     bsr        get_chunk
  297.     move.w        floor_texture,d0
  298.     bsr        get_chunk
  299.     move.l        a4,zone_ptr
  300.     clr.b        (a4)
  301. *-------------------------------------------------------*
  302.     dspwrite.b    #newssector_command,(a2)
  303. *-------------------------------------------------------*
  304.     pop.l        a6
  305. *-------------------------------------------------------*
  306.     rts
  307.  
  308. *-------------------------------------------------------*
  309. *    Retrieve all scanlines for this ssector        *
  310. *-------------------------------------------------------*
  311.     txtlong
  312. *-------------------------------------------------------*
  313. get_chunk:
  314. *-------------------------------------------------------*
  315.     move.w        brightness,d6
  316.     cmp.w        sky_index,d0
  317.     bne.s        .no_sky_texture
  318.     move.w        #sky_brightness,d6
  319. *-------------------------------------------------------*
  320. .no_sky_texture:
  321. *-------------------------------------------------------*
  322. *    Create zone header (skip null zones)         *
  323. *-------------------------------------------------------*
  324.     dspwaitread    (a2)
  325.     move.w        (a1),d1
  326.     dspwaitread    (a2)
  327.     move.w        (a1),d7
  328.     beq        .null_zone
  329.     mulu.w        #(640/8),d1
  330.     move.b        d7,(a4)+            ; zone_lines
  331.     subq.w        #1,d7
  332.     move.b        d0,(a4)+            ; zone_texture
  333.     move.w        d1,(a4)+            ; zone_start
  334. *-------------------------------------------------------*
  335. .line_loop:
  336. *-------------------------------------------------------*
  337. *    Create line header (null lines must be added)    *
  338. *-------------------------------------------------------*
  339. *    Calculate sector intensity & store with [z]    *    
  340. *-------------------------------------------------------*
  341.     dspwaitread    (a2)
  342.     move.l        (a5),d3
  343.     lsl.l        #8,d3
  344. *-------------------------------------------------------*
  345.     dspwaitread    (a2)
  346.     move.w        (a1),d0
  347.     move.w        d0,(a4)+            ; line_runs
  348.     subq.w        #1,d0
  349.     bmi.s        .null_line
  350. *-------------------------------------------------------*
  351.     dspwaitread    (a2)
  352.     move.b        1(a1),d3
  353.     ror.l        #8,d3
  354. *-------------------------------------------------------*
  355. .run_loop:
  356. *-------------------------------------------------------*
  357.     move.w        (a1),d1
  358.     subq.w        #1,d1
  359.     move.l        d3,(a4)+
  360.     swap        d1
  361.     move.w        (a1),d1
  362.     subq.w        #1,d1
  363.     move.l        d1,(a4)+
  364. *-------------------------------------------------------*
  365.     dbra        d0,.run_loop
  366. *-------------------------------------------------------*
  367. .null_line:
  368. *-------------------------------------------------------*
  369.     dbra        d7,.line_loop    
  370. *-------------------------------------------------------*
  371. .null_zone:
  372. *-------------------------------------------------------*
  373.     rts
  374.     
  375. *-------------------------------------------------------*
  376. kickstart_doomcore:
  377. *-------------------------------------------------------*
  378.     jsr        IsDspDrv
  379.     dspexec        DoomCore
  380.     rts
  381.  
  382. *-------------------------------------------------------*
  383.     include        dsplib.s
  384. *-------------------------------------------------------*
  385.  
  386. *-------------------------------------------------------*
  387.             datlong
  388. *-------------------------------------------------------*
  389.  
  390. DoomCore:        incbin    "doom.dsp'
  391. DoomCore_e:
  392.  
  393. *-------------------------------------------------------*
  394.             bsslong
  395. *-------------------------------------------------------*
  396.  
  397. ceiling_y:        ds.l    1
  398. floor_y:        ds.l    1
  399. zone_ptr:        ds.l    1
  400.  
  401.  
  402. maxy:            ds.w    320            ; upper clipping buffer.
  403. miny:            ds.w    320            ; lower clipping buffer.
  404. occlusion_list:        ds.b    320            ; byte-per-column occlusion list.
  405.  
  406. addwall_struct:        ds.b    addwall_len        ; local variables for AddWall.
  407.  
  408. columns:        ds.w    1            ; counter for columns done.
  409. wallruncount:        ds.w    1            ; counter for total wall runs.
  410.  
  411. dummy_zone:        ds.b    16
  412. zone_space:        ds.b    256000
  413.  
  414. *-------------------------------------------------------*
  415.             txtlong
  416. *-------------------------------------------------------*
  417.